<?php

namespace maotool\object;

use maotool\script\PhpScriptUtil;

/**
 * 字符串常规处理
 */
class StringUtil
{

    /**
     * 全部小写字母转为大写
     * @param $str
     * @return string|null
     */
    public static function upperCase($str)
    {
        if (is_null($str)) {
            return null;
        }
        return strtoupper($str);
    }

    /**
     * 全部大写字母转为小写
     * @param $str
     * @return string|null
     */
    public static function lowerCase($str)
    {
        if (is_null($str)) {
            return null;
        }
        return strtolower($str);
    }

    /**
     * 首字母转化为小写
     * @param $str
     * @return string|null
     */
    public static function lowerFirst($str)
    {
        if (is_null($str)) {
            return null;
        }
        return lcfirst($str);
    }

    /**
     * 首字母转化为大写
     * @param $str
     * @return string|null
     */
    public static function upperFirst($str)
    {
        if (is_null($str)) {
            return null;
        }
        return ucfirst($str);
    }

    /**
     * 每个单词的首字母转化为大写
     * @param $str
     * @return string|null
     */
    public static function upperWords($str)
    {
        if (is_null($str)) {
            return null;
        }
        return ucwords($str);
    }

    /**
     * 字符串是否为空
     * @param $str
     * @return bool
     */
    public static function hasEmpty($str)
    {
        if (isset($str)) {
            if (empty($str)) {
                return true;
            }
            return false;
        }
        return true;
    }

    /**
     * 字符串是否为空
     * @param $str
     * @return bool
     */
    public static function hasNotEmpty($str)
    {
        return !self::hasEmpty($str);
    }

    /**
     * 是否是字符串
     * @return bool
     */
    public static function isString($str)
    {
        return is_string($str);
    }

    /**
     * 是否是字符串
     * @return bool
     */
    public static function isNotString($str)
    {
        return !self::isString($str);
    }

    /**
     * 字符串替换
     * @param $search $ 匹配值
     * @param $replace $ 替换值
     * @param $subject $ 替换内容
     * @return array|string|string[]
     */
    public static function replace($search, $replace, $subject)
    {
        return str_replace($search, $replace, $subject);
    }

    /**
     * 字符串正则表达式替换
     * @param $pattern $ 匹配值
     * @param $replace $ 替换值
     * @param $subject $ 替换内容
     * @return array|string|string[]
     */
    public static function pregReplace($pattern, $replace, $subject)
    {
        return preg_replace($pattern, $replace, $subject);
    }

    /**
     * 两个字符串是否相等
     * @param $str1
     * @param $str2
     * @return bool
     */
    public static function equals($str1, $str2)
    {
        return strval($str1) === strval($str2);
    }

    /**
     * 两个字符串是否不相等
     * @param $str1
     * @param $str2
     * @return bool
     */
    public static function notEquals($str1, $str2)
    {
        return !self::equals($str1, $str2);
    }

    /**
     * 字符串去空
     * @param $str
     * @return mixed
     */
    public static function trim($str)
    {
        return trim($str);
    }

    /**
     * 字符串转数组
     * @param $str
     * @param $separator
     * @return false|string[]
     */
    public static function split($str, $separator)
    {
        return explode($separator, $str);
    }

    /**
     * 数组转字符串
     * @param $arr
     * @param $separator
     * @return string
     */
    public static function join($arr, $separator = "")
    {
        return implode($separator, $arr);
    }

    /**
     * 字符串截取
     * @return string
     */
    public static function sub($str, $start, $length)
    {
        return mb_substr($str, $start, $length);
    }

    /**
     * 获取字符串最后一个字符
     * @return string
     */
    public static function lastChar($str)
    {
        return mb_substr($str, -1);
    }

    /**
     * 字符串变量格式化
     * @param $str $ 格式化的字符串
     * @param $params $ 绑定的参数
     * @param $start $ 使用的风格 #{} [[]] {} {{}}
     * @param $uses $ 使用的类库
     * @return string
     */
    public static function format($str, $params, $callback = null, $start = "#{", $end = "}", $uses = [])
    {
        $regex = $start . "([^" . $end . "]*)" . $end;
        return preg_replace_callback('/' . $regex . '/', function ($match) use ($params, $callback) {
            if (count($match) == 2) {
                if (is_null($callback)) {
                    return PhpScriptUtil::expression($match[1], $params);
                } else {
                    return $callback($match[1], $params);
                }
            }
            return "";
        }, $str);
    }

    /**
     * 方法用于检索字符串是否以指定字符串开头
     * @param $str
     * @param $prefix
     * @return bool
     */
    public static function startsWith($str, $prefix)
    {
        if (is_array($prefix)) {
            $result = 0;
            foreach ($prefix as $item) {
                if (strncmp($str, $item, strlen($item)) === 0) {
                    ++$result;
                }
            }
            return $result > 0;
        } else {
            if (strncmp($str, $prefix, strlen($prefix)) === 0) {
                return true;
            }
        }
        return false;
    }

    /**
     * 方法用于检索字符串是否以指定字符串结尾
     * @return bool
     */
    public static function endsWith($str, $suffix)
    {
        if (is_array($suffix)) {
            $result = 0;
            foreach ($suffix as $item) {
                if (substr($str, -strlen($item)) === $item) {
                    ++$result;
                }
            }
            return $result > 0;
        } else {
            if (substr($str, -strlen($suffix)) === $suffix) {
                return true;
            }
        }
        return false;
    }

    /**
     * 移除字符串首字母
     * @param $str
     * @return false|string
     */
    public static function rmFirstWord($str)
    {
        return substr($str, 1);
    }

}